package com.epmxx.realm;

import com.epmxx.domain.User;
import com.epmxx.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @Description: 自定义用户认证和鉴权器
 */
public class MyAuthorRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    /**
     * 用户认证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("=================用户身份认证===============");
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        // 获取用户名
        String username = usernamePasswordToken.getUsername();
        String password = String.valueOf(usernamePasswordToken.getPassword());
        // 根据用户名和密码查询用户
        // 将密码校验操作 交给开发者自己校验 这样直接使用用户名和密码查询用户
        // 要么有用户 要么没有用户
        User user = userService.queryUser(username, password);
        // 如果用户为 null 说明不存在该账户，直接返回 null 后面的代码就不走，使程序性能加快
        if (user == null) {
            return null;
        }
        //以上查询角色 权限的操作在 密码校验之前做的 如果密码校验失败  查询角色权限的操作 无意义的操作
        //将密码校验操作 开发者自己校验 这样直接使用用户名和密码查询用户  要么有 要么没有
        //进行密码校验
        /**
         *  SimpleAuthenticationInfo
         *      第一个参数  身份参数 该参数被会存储和传递 一般定义为对象 存储一些关键数据
         *      第二个参数  凭证参数 指 从数据库中查询到的密码
         *      第三个参数  自定义参数 推荐这个参数不可重复  一般使用 用户名作为第三个参数
         */
        AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), user.getRealname());
        return authenticationInfo;
    }

    /**
     * 用户鉴权
     *
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }


}
